home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / lxml / ElementInclude.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  4KB  |  147 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from lxml import etree
  5. import copy
  6.  
  7. try:
  8.     from urlparse import urljoin
  9.     from urllib2 import urlopen
  10. except ImportError:
  11.     from urllib.parse import urljoin
  12.     from urllib.request import urlopen
  13.  
  14.  
  15. try:
  16.     set
  17. except NameError:
  18.     from sets import Set as set
  19.  
  20. XINCLUDE = '{http://www.w3.org/2001/XInclude}'
  21. XINCLUDE_INCLUDE = XINCLUDE + 'include'
  22. XINCLUDE_FALLBACK = XINCLUDE + 'fallback'
  23.  
  24. class FatalIncludeError(etree.LxmlSyntaxError):
  25.     pass
  26.  
  27.  
  28. def default_loader(href, parse, encoding = None):
  29.     file = open(href, 'rb')
  30.     if parse == 'xml':
  31.         data = etree.parse(file).getroot()
  32.     else:
  33.         data = file.read()
  34.         if not encoding:
  35.             encoding = 'utf-8'
  36.         
  37.         data = data.decode(encoding)
  38.     file.close()
  39.     return data
  40.  
  41.  
  42. def _lxml_default_loader(href, parse, encoding = None, parser = None):
  43.     if parse == 'xml':
  44.         data = etree.parse(href, parser).getroot()
  45.     elif '://' in href:
  46.         f = urlopen(href)
  47.     else:
  48.         f = open(href, 'rb')
  49.     data = f.read()
  50.     f.close()
  51.     if not encoding:
  52.         encoding = 'utf-8'
  53.     
  54.     data = data.decode(encoding)
  55.     return data
  56.  
  57.  
  58. def _wrap_et_loader(loader):
  59.     
  60.     def load(href, parse, encoding = None, parser = (None,)):
  61.         return loader(href, parse, encoding)
  62.  
  63.     return load
  64.  
  65.  
  66. def include(elem, loader = None, base_url = None):
  67.     if base_url is None:
  68.         if hasattr(elem, 'getroot'):
  69.             tree = elem
  70.             elem = elem.getroot()
  71.         else:
  72.             tree = elem.getroottree()
  73.         if hasattr(tree, 'docinfo'):
  74.             base_url = tree.docinfo.URL
  75.         
  76.     elif hasattr(elem, 'getroot'):
  77.         elem = elem.getroot()
  78.     
  79.     _include(elem, loader, base_url = base_url)
  80.  
  81.  
  82. def _include(elem, loader = None, _parent_hrefs = None, base_url = None):
  83.     if loader is not None:
  84.         load_include = _wrap_et_loader(loader)
  85.     else:
  86.         load_include = _lxml_default_loader
  87.     if _parent_hrefs is None:
  88.         _parent_hrefs = set()
  89.     
  90.     parser = elem.getroottree().parser
  91.     include_elements = list(elem.iter('{http://www.w3.org/2001/XInclude}*'))
  92.     for e in include_elements:
  93.         if e.tag == XINCLUDE_INCLUDE:
  94.             href = urljoin(base_url, e.get('href'))
  95.             parse = e.get('parse', 'xml')
  96.             parent = e.getparent()
  97.             if parse == 'xml':
  98.                 if href in _parent_hrefs:
  99.                     raise FatalIncludeError('recursive include of %r detected' % href)
  100.                 
  101.                 _parent_hrefs.add(href)
  102.                 node = load_include(href, parse, parser = parser)
  103.                 if node is None:
  104.                     raise FatalIncludeError('cannot load %r as %r' % (href, parse))
  105.                 
  106.                 node = _include(node, loader, _parent_hrefs)
  107.                 if e.tail:
  108.                     if not node.tail:
  109.                         pass
  110.                     node.tail = '' + e.tail
  111.                 
  112.                 if parent is None:
  113.                     return node
  114.                 
  115.                 parent.replace(e, node)
  116.             elif parse == 'text':
  117.                 text = load_include(href, parse, encoding = e.get('encoding'))
  118.                 if text is None:
  119.                     raise FatalIncludeError('cannot load %r as %r' % (href, parse))
  120.                 
  121.                 predecessor = e.getprevious()
  122.                 if predecessor is not None:
  123.                     if not predecessor.tail:
  124.                         pass
  125.                     predecessor.tail = '' + text
  126.                 elif parent is None:
  127.                     return text
  128.                 elif not parent.text:
  129.                     pass
  130.                 if not e.tail:
  131.                     pass
  132.                 parent.text = '' + text + ''
  133.                 parent.remove(e)
  134.             else:
  135.                 raise FatalIncludeError('unknown parse type in xi:include tag (%r)' % parse)
  136.         parse == 'xml'
  137.         if e.tag == XINCLUDE_FALLBACK:
  138.             parent = e.getparent()
  139.             if parent is not None and parent.tag != XINCLUDE_INCLUDE:
  140.                 raise FatalIncludeError('xi:fallback tag must be child of xi:include (%r)' % e.tag)
  141.             
  142.         parent.tag != XINCLUDE_INCLUDE
  143.         raise FatalIncludeError('Invalid element found in XInclude namespace (%r)' % e.tag)
  144.     
  145.     return elem
  146.  
  147.